/**
 * 网络请求工具类
 */

// 服务器基础URL
export const SERVER_BASE_URL = 'http://192.168.0.3:8080';

// 请求拦截器
const requestInterceptor = (config) => {
  // 添加token到请求头
  const token = uni.getStorageSync('token');
  if (token) {
    config.header = config.header || {};
    config.header['Authorization'] = `Bearer ${token}`;
    console.log('设置请求头token:', token); // 添加日志
  }
  
  // 确保GET请求参数正确处理
  if (config.method === 'GET' && config.data) {
    config.url = config.url + (config.url.includes('?') ? '&' : '?') + Object.keys(config.data)
      .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(config.data[key])}`)
      .join('&');
    // GET请求不应该有请求体
    config.data = {};
  }
  
  return config;
};

// 响应拦截器
const responseInterceptor = (response) => {
  // 处理401未授权错误（token无效或过期）
  if (response.statusCode === 401) {
    // 清除用户信息和token
    uni.removeStorageSync('user');
    uni.removeStorageSync('token');
    
    // 提示用户重新登录
    uni.showToast({
      title: '登录已过期，请重新登录',
      icon: 'none'
    });
    
    // 延迟跳转到登录页面
    setTimeout(() => {
      uni.navigateTo({
        url: '/pages/login/login'
      });
    }, 1500);
    
    return Promise.reject(response.data);
  }
  
  // 处理其他正常响应
  if (response.statusCode === 200) {
    // 直接返回完整的ResponseResult对象，让调用者处理内部的code和data
    return response.data;
  }
  
  // 处理其他错误情况
  uni.showToast({
    title: response.data?.message || '网络请求失败',
    icon: 'none'
  });
  
  return Promise.reject(response.data);
};

// 错误处理
const handleError = (error) => {
  uni.showToast({
    title: '网络请求失败，请检查网络连接',
    icon: 'none'
  });
  return Promise.reject(error);
};

// 统一请求方法
const request = (options) => {
  // 合并选项
  options.url = options.url.startsWith('http') ? options.url : SERVER_BASE_URL + options.url;
  options.header = options.header || {};
  options = requestInterceptor(options);
  
  // 返回Promise
  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      success: (res) => {
        try {
          const result = responseInterceptor(res);
          resolve(result);
        } catch (e) {
          reject(e);
        }
      },
      fail: (err) => {
        handleError(err);
        reject(err);
      }
    });
  });
};

// 封装常用请求方法
const http = {
  get: (url, options = {}) => {
    // 处理GET请求，直接使用url，不在请求体中添加参数
    return request({
      url,
      method: 'GET',
      // GET请求不需要在data中传参
      header: options.header || {}
    });
  },
  post: (url, data, options = {}) => {
    return request({
      url,
      method: 'POST',
      data,
      header: options.header || {}
    });
  },
  put: (url, data, options = {}) => {
    return request({
      url,
      method: 'PUT',
      data: data || {}, // 确保data不为null
      header: options.header || {}
    });
  },
  delete: (url, options = {}) => {
    return request({
      url,
      method: 'DELETE',
      // DELETE请求不需要在data中传参
      header: options.header || {}
    });
  }
};

export default http; 